/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package AccesoDatos.Persistencia.Manager;

import AccesoDatos.Persistencia.Entidad.EEjemplar;
import AccesoDatos.Persistencia.Entidad.ELibro;
import LogicaNegocio.Biblioteca.Ejemplar;
import LogicaNegocio.Biblioteca.Libro;
import MainBiblioSoft.BiblioSoft;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;

/**
 * Esta clase en java es el gestor de persistencia
 * de objetos Ejemplar en la base de datos BiblioSoft.
 *
 * @author sebaxtian
 * Archivo: ManagerEjemplar.java
 * @version 1.0
 * Fecha: dom may  2 11:19:18 COT 2010
 */


public class ManagerEjemplar {

    @PersistenceUnit
    private EntityManagerFactory managerFactory;
    private EntityManager entityManager;

    /**
     * Metodo constructor, crea un gestor para la persistencia de Ejemplar
     * 
     */
    public ManagerEjemplar() {
        managerFactory = BiblioSoft.managerFactory;
        entityManager = managerFactory.createEntityManager();
    }

    /**
     * Este metodo se encarga de la persistencia en la entidad Ejemplar
     * de un objeto Ejemplar.
     *
     * @param ejemplar
     */
    public void crearEjemplar(Ejemplar ejemplar) {
        entityManager.clear();
        EEjemplar entidadEjemplar = new EEjemplar();
        entidadEjemplar.setIsbn(ejemplar.getIsbn());
        entidadEjemplar.setNumerosala(ejemplar.getNumeroSala());
        entidadEjemplar.setNumeropasillo(ejemplar.getNumeroPasillo());
        entidadEjemplar.setNumeroestante(ejemplar.getNumeroEstante());
        entidadEjemplar.setNumerocajon(ejemplar.getNumeroCajon());
        entidadEjemplar.setDisponible(ejemplar.isDisponible());
        //persiste el objeto en la entidad
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entityManager.persist(entidadEjemplar);
        transaccion.commit();
        entityManager.clear();
    }

    /**
     * Este metodo elimina un ejemplar de la base de datos.
     *
     * @param idEjemplar
     */
    public void eliminarEjemplar(int idEjemplar) {
        entityManager.clear();
        EEjemplar entidadEjemplar;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadEjemplar = entityManager.find(EEjemplar.class, idEjemplar);
        transaccion.commit();
        if(entidadEjemplar != null){
            transaccion.begin();
            entityManager.remove(entidadEjemplar);
            transaccion.commit();
        }
        entityManager.clear();
    }

    /**
     * Metodo que actualiza un ejemplar de la base de datos.
     *
     * @param idEjemplar
     * @param ejemplar
     */
    public void actualizarEjemplar(int idEjemplar, Ejemplar ejemplar) {
        entityManager.clear();
        EEjemplar entidadEjemplar;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadEjemplar = entityManager.find(EEjemplar.class, idEjemplar);
        transaccion.commit();
        if(entidadEjemplar != null){
            entidadEjemplar.setIsbn(ejemplar.getIsbn());
            entidadEjemplar.setNumerosala(ejemplar.getNumeroSala());
            entidadEjemplar.setNumeropasillo(ejemplar.getNumeroPasillo());
            entidadEjemplar.setNumeroestante(ejemplar.getNumeroEstante());
            entidadEjemplar.setNumerocajon(ejemplar.getNumeroCajon());
            entidadEjemplar.setDisponible(ejemplar.isDisponible());
            transaccion.begin();
            entityManager.merge(entidadEjemplar);
            transaccion.commit();
        }
        entityManager.clear();
    }

    /**
     * Metodo que permite obtener el ejemplar identificado
     * con el id ejemplar.
     * Retorna null si no existe el ejemplar.
     *
     * @param idEjemplar
     * @return ejemplar
     */
    public Ejemplar obtenerEjemplar(int idEjemplar){
        entityManager.clear();
        EEjemplar entidadEjemplar;
        Ejemplar ejemplar = null;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadEjemplar = entityManager.find(EEjemplar.class, idEjemplar);
        transaccion.commit();
        if(entidadEjemplar != null){
            ejemplar = new Ejemplar();
            ejemplar.setIdEjemplar(entidadEjemplar.getIdejemplar());
            ejemplar.setIsbn(entidadEjemplar.getIsbn());
            ejemplar.setNumeroSala(entidadEjemplar.getNumerosala());
            ejemplar.setNumeroPasillo(entidadEjemplar.getNumeropasillo());
            ejemplar.setNumeroEstante(entidadEjemplar.getNumeroestante());
            ejemplar.setNumeroCajon(entidadEjemplar.getNumerocajon());
            ejemplar.setDisponible(entidadEjemplar.getDisponible());
            ejemplar.setLibro(obtenerLibroEjemplar(idEjemplar));
        }
        entityManager.clear();
        return ejemplar;
    }

    /**
     * Este metodo permite obtener el libro al que pertenece el ejemplar.
     *
     * @param idEjemplar
     * @return libro
     */
    public Libro obtenerLibroEjemplar(int idEjemplar) {
        entityManager.clear();
        Libro libro = null;
        EEjemplar entidadEjemplar;
        ELibro entidadLibro;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadEjemplar = entityManager.find(EEjemplar.class, idEjemplar);
        transaccion.commit();
        if(entidadEjemplar != null){
            transaccion.begin();
            entidadLibro = entityManager.find(ELibro.class, entidadEjemplar.getIsbn());
            transaccion.commit();
            libro = new Libro();
            libro.setIsbn(entidadLibro.getIsbn());
            libro.setCodigoEditorial(entidadLibro.getCodigoeditorial());
            libro.setTitulo(entidadLibro.getTitulo());
            libro.setAnoPublicacion(entidadLibro.getAnopublicacion());
            libro.setIdioma(entidadLibro.getIdioma());
            libro.setActivo(entidadLibro.getActivo());
            libro.setCantidadBusquedas(entidadLibro.getCantbusquedas());
        }
        entityManager.clear();
        return libro;
    }
}
